package org.zn.note.java8;

import org.zn.note.java8.Bean.Dish;

import java.util.List;

/**
 * Java 8 Stream 对于同一问题，有多个解决方案，但记住某个场景下最优的就好了！！！
 * 这里记录最优解，最佳实践，工程中有类似场景直接用这种方案
 *
 * 1、基础数据类型(int、long、double)的归约(求和、平均数、乘积等)
 * 就是转换为IntStream再调用现成的方法，例子 {@link #sumInt()}
 * menu.stream().mapToInt(Dish::getCalories).sum();  // Dish::getCalories 是int类型，避免int=Integer转换
 *
 * 2、.distinct.collect(toList()) = .collect(toSet())
 * 指定数据结构：.collect(toCollection(), ArrayList::new);
 */
public class FinalSolution {

    // 菜单
    private static final List<Dish> menu = Dish.genDishs();

    /**
     * int求和
     * long、double这种基础数据类型，都是这种方案，就是为了避免装箱拆箱
     * 不仅是求和，其他的计算，也用这种方案
     */
    private static int sumInt() {
        return menu.stream()
                .mapToInt(Dish::getCalories) // 转成IntStream进行计算“归约”
                .sum();
    }
}
